package com.example.taobaounion.presenter.impl;

import com.example.taobaounion.model.Api;
import com.example.taobaounion.model.bean.HomePagerContent;
import com.example.taobaounion.presenter.ICategoryPagerPresenter;
import com.example.taobaounion.utils.LogUtils;
import com.example.taobaounion.utils.RetrofitManager;
import com.example.taobaounion.utils.UrlUtils;
import com.example.taobaounion.view.ICategoryPagerCallback;

import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class CategoryPagerPresenterImpl implements ICategoryPagerPresenter {

    //多个页面需要使用，因为多个分类TabLayout，点击多次，防止内存消耗,需要用集合保存下来
    //page集合
    private Map<Integer,Integer> pagesInfo=new HashMap<>();
    //注册接口集合
    List<ICategoryPagerCallback> mCallbacks=new ArrayList<>();
    //private ICategoryPagerCallback mICategoryPagerCallback=null;
    public static final int DEFAULT_PAGE=1;
    private Integer mCurrentPage;

//    public CategoryPagerPresenterImpl(){
//
//    }
//
//    private static ICategoryPagerPresenter sInstance=null;
//
//    //多个页面需要使用，因为多个分类TabLayout，点击多次，HomePagerFragment多次创建该对象，可以使用单例模式
//    public static ICategoryPagerPresenter getInstance(){
//        if(sInstance==null){
//            sInstance=new CategoryPagerPresenterImpl();
//        }
//        return sInstance;
//    }

    @Override
    public void getContentByCategoryId(int categoryId) {
        //为提前加载的页面提供数据
        for (ICategoryPagerCallback callback:mCallbacks){
            if(callback.getCategoryId()==categoryId) {
                callback.onLoading();
            }
        }
        //mICategoryPagerCallback.onLoading(categoryId);
        //根据分类id去加载内容页码
        Integer targetPage = pagesInfo.get(categoryId);
        if(targetPage==null){
            targetPage=DEFAULT_PAGE;
            //将id和页数构成key-value
            pagesInfo.put(categoryId,targetPage);
        }
        LogUtils.d(this,"targetPage--->"+targetPage);//都是1表示获取第一页的内容
        Call<HomePagerContent> task = createTask(categoryId, targetPage);
        task.enqueue(new Callback<HomePagerContent>() {
            @Override
            public void onResponse(Call<HomePagerContent> call, Response<HomePagerContent> response) {
                int code=response.code();
                LogUtils.d(CategoryPagerPresenterImpl.this,"code--->"+code);
                if(code== HttpURLConnection.HTTP_OK){
                    HomePagerContent pageContent = response.body();
                    //Presenter层拿到数据后要给到UI层去更新
                    LogUtils.d(CategoryPagerPresenterImpl.this,"pageContent-->"+pageContent);
                    //把数据给到UI去更新
                    handleHomePageContentResult(pageContent,categoryId);
                }else {
                    handleNetWorkError(categoryId);
                }
            }

            @Override
            public void onFailure(Call<HomePagerContent> call, Throwable t) {
                LogUtils.d(CategoryPagerPresenterImpl.this,"onFailure--->"+t.toString());
                handleNetWorkError(categoryId);
            }
        });

    }

    private Call<HomePagerContent> createTask(int categoryId, Integer targetPage) {
        Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
        Api api = retrofit.create(Api.class);
        String homePagerUrl = UrlUtils.createHomePagerUrl(categoryId, targetPage);
        LogUtils.d(CategoryPagerPresenterImpl.this,"home pager url--->"+homePagerUrl);
        Call<HomePagerContent> task = api.getHomePageContent(homePagerUrl);
        return task;
    }

    private void handleNetWorkError(int categoryId) {
        for(ICategoryPagerCallback callback:mCallbacks){
            //通过引用getCategoryId接口，可在Presenter进行判断，UI层可省去关于判断id的代码
            if(callback.getCategoryId()==categoryId){
                callback.onError();
            }
        }
    }

    private void handleHomePageContentResult(HomePagerContent pageContent, int categoryId) {
        List<HomePagerContent.DataBean> data = pageContent.getData();
        //通知UI层更新数据
        for (ICategoryPagerCallback callback:mCallbacks) {//判断添加的集合里有没有当前页面的id，是的话更新数据
            if (callback.getCategoryId() == categoryId) {
                if (pageContent == null || pageContent.getData().size() == 0) {
                    callback.onEmpty();
                } else {
                    //取下标为data.size() - 5到data.size()的元素,不包含下标为data.size()的元素
                    List<HomePagerContent.DataBean> looperData = data.subList(data.size() - 5, data.size());
                    //轮播图数据
                    callback.onLooperListLoaded(looperData);
                    //列表数据
                    callback.onContentLoaded(data);
                }
            }
        }
        //如果不用集合的话，你预加载的时候他不只是注册当前一个fragment会注册前面一个和后一个，这样会造成
        //比如你前面在loading的时候,他注册一个进来，此时的对象已经更换成了，他会一直在loading而刚刚那个注册进来的
        //反而已经更新数据了，所以需要用集合保存起来
        //mICategoryPagerCallback.onContentLoaded(pageContent.getData(),categoryId);
    }

    @Override
    public void loaderMore(int categoryId) {
        //加载更多的数据
        //1.拿到当前页面
        mCurrentPage = pagesInfo.get(categoryId);
        if(mCurrentPage ==null){
            mCurrentPage =1;
        }
        //2.页码++
        mCurrentPage++;
        //3.加载数据
        Call<HomePagerContent> task = createTask(categoryId, mCurrentPage);
        LogUtils.d(CategoryPagerPresenterImpl.this,"mCurrentPage--->"+mCurrentPage);
        //4.处理数据结果
        task.enqueue(new Callback<HomePagerContent>() {
            @Override
            public void onResponse(Call<HomePagerContent> call, Response<HomePagerContent> response) {
                //结果
                int code=response.code();
                if(code==HttpURLConnection.HTTP_OK){
                    HomePagerContent result = response.body();
                    LogUtils.d(CategoryPagerPresenterImpl.this,"result--->"+result);
                    handleLoaderResult(result,categoryId);
                }else {
                    handleLoaderMoreError(categoryId);
                }
            }

            @Override
            public void onFailure(Call<HomePagerContent> call, Throwable t) {

                //请求失败
                LogUtils.d(CategoryPagerPresenterImpl.this,t.toString());
                handleLoaderMoreError(categoryId);
            }
        });


    }

    private void handleLoaderResult(HomePagerContent result, int categoryId) {
        for(ICategoryPagerCallback callback:mCallbacks){
            if(callback.getCategoryId()==categoryId){
                if(result==null||result.getData().size()==0){
                    callback.onLoadMoreEmpty();
                }else {
                    callback.onLoaderMoreLoaded(result.getData());
                }
            }
        }
    }

    private void handleLoaderMoreError(int categoryID) {
        mCurrentPage--;
        pagesInfo.put(categoryID,mCurrentPage);
        for (ICategoryPagerCallback callback:mCallbacks){
            if(callback.getCategoryId()==categoryID){
                callback.onLoaderMoreError();
            }
        }
    }

    @Override
    public void reload(int categoryId) {

    }

    /**
     * 由于ViewPager中的懒加载，他会预先加载前面和自己和后面两个fragment，这时我们需要在预先加载的时候通过集合注册过去
     * 当不是加载前面和自己和后面两个fragment会销毁掉对应的页面所以取消注册，所以用到集合
     * @param callback
     */
    @Override
    public void registerViewCallback(ICategoryPagerCallback callback) {
        //用集合来报存，包含的话就不用重新增加
     if (!mCallbacks.contains(callback)){
         mCallbacks.add(callback);
     }
       // mICategoryPagerCallback=callback;
    }

    @Override
    public void unregisterViewCallback(ICategoryPagerCallback callback) {
        mCallbacks.remove(callback);
    }
}
